#include <iostream>
#include"pushwork.h"
#include"dlog.h"

using namespace std;

// 使用 ffplay 命令来拉流【播放视频】
//减少缓冲 ffplay.exe -i rtmp://xxxxxxx -fflags nobuffer
// 减少码流分析时间 ffplay.exe -i rtmp://xxxxxxx -analyzeduration 1000000 单位为微秒
// ffplay -i rtsp://192.168.2.132/live/livestream -fflags nobuffer -analyzeduration 1000000 -rtsp_transport udp

#define RTSP_URL "rtsp://127.0.0.1:8554/live/22"  // 本地mediamtx
//#define RTSP_URL "rtsp://192.168.16.107/live/livestream" // 公司服务器

// 使用ffmpeg 命令将本地文件推送到流媒体服务器中来推流【推流】
// ffmpeg -re -i  rtsp_test_hd.flv  -vcodec copy -acodec copy  -f flv -y rtsp://111.229.231.225/live/livestream
// ffmpeg -re -i  rtsp_test_hd.flv  -vcodec copy -acodec copy  -f flv -y rtsp://192.168.1.12/live/livestream
// ffmpeg -re -i  1920x832_25fps.flv  -vcodec copy -acodec copy  -f flv -y rtsp://111.229.231.225/live/livestream



int main(int argc, char *argv[])
{
    cout << "Hello World!" << endl;

    // 保存log文件
    init_logger("rtsp_push.log", S_INFO);
//    init_logger("rtsp_push.log", S_DEBUG);
    {
        PushWork pushWork;
        Properties properties;
        // 音频测试模式
        properties.SetProperty("audio_test", 1);    // 音频测试模式
        properties.SetProperty("input_pcm_name", "D:\\data\\video\\demo\\48000_2_s16le.pcm");
        // 麦克风采样属性
        properties.SetProperty("mic_sample_fmt", AV_SAMPLE_FMT_S16);
        properties.SetProperty("mic_sample_rate", 48000);
        properties.SetProperty("mic_channels", 2);
        // 视频测试模式
        properties.SetProperty("video_test", 1);
        properties.SetProperty("input_yuv_name", "D:\\data\\video\\demo\\720x480_25fps_420p.yuv");
        // 桌面录制属性
        properties.SetProperty("desktop_x", 0);
        properties.SetProperty("desktop_y", 0);
        // 如果不知道本地视频文件宽高多少，可以使用 mediaInfo 软件查看，或者 ffprobe 命令查看视频文件信息
        properties.SetProperty("desktop_width", 1280); //测试模式时和yuv文件的宽度一致！！否则会花屏
        properties.SetProperty("desktop_height", 720);  //测试模式时和yuv文件的高度一致！！否则会花屏
        properties.SetProperty("desktop_fps", 25);//测试模式时和yuv文件的帧率一致
        properties.SetProperty("video_bit_rate", 512*1024);  // 设置码率
        // 配置RSTP
        properties.SetProperty("rtsp_url", RTSP_URL);
        properties.SetProperty("rtsp_transport", "tcp"); // 确实，tcp和udp差距太大了，使用udp就是会有花屏、马赛克的情况。使用tcp就不会。
        properties.SetProperty("rtsp_timeout", 5000);
        // 初始化推流器的参数
        if(pushWork.init(properties) != RET_OK)
        {
            LogError("PushWork init failed");
            return -1;
        }
        LogError("start log time");
        int count = 0;
        // 测试5秒数据
        while(true)
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(1000));
            if(++count >= 500)
            {
                break;
            }
        }
    }
    LogInfo("leave");
    return 0;
}
